/***************************************************************************
 创建者: 华磊
 开始时间: 2020.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2020.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file GeneralDefine.h
 *  功能:通用数据结构，早期定义
 *
 *                                                                         *
 ***************************************************************************/
#ifndef GENERAL_DEFINE_H
#define GENERAL_DEFINE_H
//math和fundation的头文件结构体定义不一致会导致随机的内存错误。
#include <qstring.h>
#include "instructionstruct.h"

#ifndef soapStub_H
/**

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
#include  "gSoapFoundation/soapStub.h"

#endif

#include <iostream>
#include <vector>
#include <QVector>

using namespace std;

#define D_MIN_NAV_CNT 10 //最小平滑ｍｍ
struct Pinfo
{
    double x;
    double y;
    double z;
};

enum E_MOVING_FLAG
{
    E_MOVING_FLAG_NONE,
    E_MOVING_FLAG_RUNNING,
    E_MOVING_FLAG_REACHED,
};

enum E_BIAS_TYPE
{
    E_BIAS_TYPE_NONE,//停止，偏差为０
    E_BIAS_TYPE_IDILE,//空闲，偏差沿用上次的值
    E_BIAS_TYPE_ROTATE,//轨迹旋转段的偏差计算
    E_BIAS_TYPE_MOVE_LINE,//轨迹直线段的偏差计算
    E_BIAS_TYPE_ABSOLUTE,//轨迹运行完后的末端定位
    E_BIAS_TYPE_STEERING_WAIT,//舵轮过渡
};

struct PositionInfo
{
    VehiclePosition position;
    struct timespec matchSucessTimeStmap;
    bool isUpdateSucess;
    double maxMatchError;
    double matchScore;
};




struct VirtualLineDebugInfo {
      public:
        /** Required element 'deltaTime' of XSD type 'xsd:double' */
        double deltaTime;
        /** Required element 'currentLineRemainingTime' of XSD type 'xsd:float' */
        float currentLineRemainingTime;
        /** Required element 'currentLine' of XSD type 'xsd:float' */
        float currentLine;
        /** Required element 'lineQueueSize' of XSD type 'xsd:int' */
        int lineQueueSize;
        /** Required element 'motionServerMode' of XSD type 'xsd:int' */
        int motionServerMode;
        /** Required element 'basicStatus' of XSD type 'xsd:int' */
        int basicStatus;
        /** Required element 'commandQueueSize' of XSD type 'xsd:int' */
        int commandQueueSize;
        /** Required element 'isVelprofileEmpty' of XSD type 'xsd:int' */
        int isVelprofileEmpty;
        /** Required element 'timeAxisScale0' of XSD type 'xsd:double' */
        double timeAxisScale0;
        /** Required element 'commonThreadStage' of XSD type 'E-COMMON-THREAD-STAGE' */
        enum E_COMMON_THREAD_STAGE commonThreadStage;
        /** Required element 'realThreadStage' of XSD type 'E-REAL-THREAD-STAGE' */
        enum E_REAL_THREAD_STAGE realThreadStage;
        /** Required element 'threadId' of XSD type 'xsd:int' */
        int threadId;
        /** Required element 'axisGroupInfo' of XSD type 'AxisGroupDebugInfo' */
        struct AxisGroupDebugInfo axisGroupInfo;

        double deltaDistance;
        double deltaAngle;
        double absoluteDistance;
        double absoluteAngle;
//        double pathPidOutput;
//        double velocityPidOutput;
        E_BIAS_TYPE calculateBiasType;
        double deltaDistance_y;
        double barrierProtectRatio;


};


enum EN_BATTERY_STATUS
{
    EN_BATTERY_STATUS_UNKNOW_VENDOR,
    EN_BATTERY_STATUS_NORMAL,
    EN_BATTERY_STATUS_CANNOT_ACCESS_DRIVER,
    EN_BATTERY_STATUS_LOOSE_VOLTAGE,
    EN_BATTERY_STATUS_SDO_ERROR,
    EN_BATTERY_STATUS_NO_ROBOT,
    EN_BATTERY_STATUS_AXIS_SUM_ERROR,
    EN_BATTERY_STATUS_AXIS_NUM_ERROR,
    EN_BATTERY_STATUS_AXIS_NUMBER_ERROR
};

enum E_BACKUP_TYPE
{
    E_BACKUP_TYPE_BIN=0,
    E_BACKUP_TYPE_GLOBALCONFIG=1,
    E_BACKUP_TYPE_ROBOTCONFIG=2,
    E_BACKUP_TYPE_ROBOT_COORDINATE_DATA=3,
    E_BACKUP_TYPE_ROBOT_ALL_PROGRAM=4,
    E_BACKUP_TYPE_ROBOT_ONE_PROGRAM=5,
    E_BACKUP_TYPE_ALL_FILES=6,

};

enum E_STORAGE_TYPE
{
    E_STORAGE_TYPE_PC_HARDDISK=0,
    E_STORAGE_TYPE_PC_USBDISK=1
};

enum E_FILEPATH_TYPE
{
    E_FILEPATH_TYPE_PC_HARDDISK_BACKUP=0,
    E_FILEPATH_TYPE_PC_USBDISK_BACKUP=1,
    E_FILEPATH_TYPE_AGV_MUSIC=2
};


enum POLLCODE_STATUS_TYPE
{
    ENUM_TIME_NORMAL = 100,
    ENUM_TIME_GOING_PASSED,
    ENUM_TIME_PASSED,
    ENUM_SERIAL_UNEQUAL,
    ENUM_REGISTER_FILE_NO_EXIST,
    ENUM_REGISTER_FILE_NODE_ERROR,
    ENUM_REGISTER_FILE_CHECK_CODE_ERROR,
    ENUM_BOOT_COUNT_EXCEED,
    ENUM_POLLCODE_END
};

enum USER_POWER
{
    ENUM_POWER_COMMON_CONSUMER,
    ENUM_POWER_ADMIN,
    ENUM_POWER_END
};

//enum MC_CONTROLLER_STATUS
//{
//    ENUM_STOP = 0,
//    ENUM_RUN = 1,
//    ENUM_CEASE = 2,
//    ENUM_ERROR = 3,
//    ENUM_INIT_ERROR = 4,//2017.2.16 华磊添加，初始化失败时的状态
//    ENUM_CEASING=5,
//    ENUM_STOPPING=6 //hualei 华磊　添加
//};
enum MC_INTEPRETER_STATUS
{
    ENUM_STOP = 0,
    ENUM_RUN = 1,
    ENUM_CEASE = 2,
    ENUM_ERROR = 3,

    ENUM_INTEPRETER_INIT_ERROR = 20,//2017.2.16 华磊添加，初始化失败时的状态
    ENUM_INTEPRETER_INIT = 21,
    ENUM_INTEPRETER_ERROR=22

};

enum MC_TRAJECTORY_STATUS
{
    ENUM_TRAJECTORY_INITIAL = 11,
    ENUM_TRAJECTORY_RUN = 1,
    ENUM_TRAJECTORY_TOSTOP = 12,
    ENUM_TRAJECTORY_STOPPING = 13,
    ENUM_TRAJECTORY_STOPPED = 0,
    ENUM_TRAJECTORY_TOCEASE = 14,
    ENUM_TRAJECTORY_CEASING = 15,
    ENUM_TRAJECTORY_CEASED = 2

};

enum E_DRAG_STATUS
{
    ENUM_DRAG_STOPPED,
    ENUM_DRAG_FORWARD_RUN,
    ENUM_DRAG_FORWARD_STOPPING,
    ENUM_DRAG_REVERSE_RUN,
    ENUM_DRAG_REVERSE_STOPPING
};

enum MC_MOTION_MODEL
{
    ENUM_MOTION_MODEL_TRAJECTORY_COMMAND_PROCESS=1,//运行程序 auto,JOG ,MOVE TO POINT 合并到一种
    ENUM_MOTION_MODEL_HOMING=2,
    ENUM_MOTION_MODEL_DRAG=3,
    ENUM_MOTION_MODEL_VEHICLE_MAGANIC_TRACK=4,
    ENUM_MOTION_MODEL_VEHICLE_JOG=5,
    ENUM_MOTION_MODEL_VEHICLE_ROS_CONTROL=6,
    ENUM_MOTION_MODEL_VEHICLE_VIRTUAL_LINE_TRACK=7,

};

enum CURRENT_LINE
{
    ENUM_LINE_INITIAL=-1,\
    ENUM_LINE_MOVETOPOINT=-2,
    ENUM_LINE_JOG=-3,
    ENUM_LINE_STOP=-4,
    ENUM_LINE_DRAG=-5
};

enum MC_JOG_COORDINATE
{
    ENUM_JOINT = 0,
    ENUM_TOOL = 1,
    ENUM_USER = 2,//2017.2.21 华磊修改枚举顺序，与hmi同步
    ENUM_WORLD = 3
};

enum MC_COMMAND
{
    ENUM_COMMAND_JOINT_VARIABLE = 0,//统一使用这种，速度类型使用默认设定．
    ENUM_COMMAND_LINE = 1,
    ENUM_COMMAND_CIRCLE = 2,
    ENUM_COMMAND_JOINT_CONTINIOUS = 3,
    ENUM_COMMAND_CARTESIAN_CONTINIOUS = 4,
    ENUM_COMMAND_JOINT_CONTINIOUS_LOOP = 5,
    ENUM_COMMAND_CARTESIAN_CONTINIOUS_LOOP = 6,
    ENUM_COMMAND_JOINT_TRAP = 7,
    ENUM_COMMAND_SINGLE_AXIS_TRAP = 8,
    ENUM_COMMAND_SINGLE_AXIS_SPLINE = 9,
    ENUM_COMMAND_JOINT_SPLINE = 10,//速度类型不在通过用户指令类型指定，而是通过加速度类型设定．

};

enum VELOCITY_UNIT
{
    ENUM_RATIO = 0,
    ENUM_MMPS  = 1,
    ENUM_DEGREEPS = 2,
    ENUM_TIME_DURATION =3
};

enum SET_TOOL
{
    ENUM_TOOL_3POINTS = 0,
    ENUM_TOOL_6POINTS = 1,
    ENUM_TOOL_XYZWPR = 2,
    ENUM_TOOL_20POINTS = 3,
    ENUM_TOOL_23POINTS = 4,
    ENUM_TOOL_20POINTS_ZEROCAL = 5,
};


enum SET_USER
{
    ENUM_USER_3POINTS = 0,
    ENUM_USER_4POINTS = 1,
    ENUM_USER_XYZWPR = 2
};

//2017.02.20 lfd添加
enum MC_ROBOT_TYPE//机械臂类型
{
    ENUM_SCARA =1, //SCARA
    ENUM_6AXIS_CHAIN=2,//六轴垂直串联
    ENUM_4AXIS_PALLET=3,//四轴码垛
    ENUM_7AXIS=4,//7轴码垛
    ENUM_DELTA_ROBOT_3Axis=5,
    ENUM_DELTA_ROBOT_4Axis=6,//华盛控
    ENUM_DELTA_ROBOT_4Axis_EIGHT_LEG=7,
    ENUM_JOINT_ROBOT=8,
    ENUM_DESCART_ROBOT=9,//笛卡尔直角坐标机器人3轴
    ENUM_DESCART_WRIST_ROBOT=10,//笛卡尔直角坐标+手腕机器人
    ENUM_UR_6AXIS=11,//UR机器人
    ENUM_HEXPOD_6AXIS=12,//并联六轴
    ENUM_DESCART_XYZR_ROBOT=13,//笛卡尔直角坐标机器人4轴
    ENUM_DESCART_WRAC_ROBOT=14,//笛卡尔直角坐标+手腕AC机器人
    ENUM_DESCART_WRACTEST_ROBOT=15,//笛卡尔直角坐标+手腕AC机器人,直接１对１映射
    ENUM_ROBOT_TYPE_END//不支持类型
};

//enum LANGUAGE_TYPE
//{
//    ENUM_LAN_CHINESE,
//    ENUM_LAN_ENGLISH,
//    ENUM_LAN_END
//};

//点类型
enum POINT_TYPE
{
    ENUM_NORMAL_POINT,
    ENUM_PALLET_POINT,
    ENUM_PR_POINT,
    ENUM_DIRECT_POINT,
    ENUM_POINT_END
};

////语言类型
//enum LANGUAGE_TYPE
//{
//    ENUM_LAN_CHINESE,//中文
//    ENUM_LAN_ENGLISH,//英文
//    ENUM_LAN_END
//};
//消息级别
enum MSG_LEVEL_TYPE
{
    ENUM_MSG_ERROR,//错误
    ENUM_MSG_WARNING,//警告
    ENUM_MSG_REMIND,//提示
    ENUM_MSG_END
};
//消息、日志类别
enum MESSAGE_TYPE
{
    ENUM_MESSAGE_MSG,//普通消息
    ENUM_MESSAGE_LOG,//写入日志文件
    ENUM_MESSAGE_END
};


//运动类型,20170111华磊修改,删除自动
enum MOVE_TYPE
{
    ENUM_MOVE_ORDER_STEP,//单步
    ENUM_MOVE_HAND_SERIES,//连续
    ENUM_MOVE_END
};
//控制模式,20170111华磊添加
enum EN_CONTROL_TYPE
{
    ENUM_CONTROL_T1,//T1
    ENUM_CONTROL_T2,//T2
    ENUM_CONTROL_AUTO,//自动
    ENUM_CONTROL_EXT,//外部
    ENUM_CONTROL_FLEET,//调度系统控制
    ENUM_CONTROL_END
};


enum E_PROGRAM_LOOP_RESULT
{
    E_PROGRAM_LOOP_RESULT_ERROR=-1,
    E_PROGRAM_LOOP_RESULT_NORMAL=1,
    E_PROGRAM_LOOP_RESULT_CEASE_STOP=2,
    E_PROGRAM_LOOP_RESULT_PROGRAM_FINISHED=3,
    E_PROGRAM_LOOP_RESULT_JUMP=4,

};


//码垛类型
enum STACK_TYPE
{
    ENUM_STACK_B,//B型码垛
    ENUM_STACK_E,//E型码垛
    ENUM_STACK_BX,//BX型码垛
    ENUM_STACK_EX//EX型码垛
};

//码垛点类型
enum STACK_POINT
{
    ENUM_STACK_POINT_BTM=0,
    ENUM_STACK_POINT_AN=1,
    ENUM_STACK_POINT_RN=2,
    ENUM_STACK_POINT_END
};
//steven　启动方式：冷启动、热启动
enum ROBOT_START_TYPE
{
    ROBOT_COOL_START,
    ROBOT_HOT_START,
    ROBOT_END_START
};

enum ROBOT_CMD_TYPE
{
	///全局命令
	POWER_OFF,//关机
    REBOOT,//重启
        

	SAVE_GLOBAL_REG_R,
	SAVE_GLOBAL_REG_PR,
	SAVE_GLOBAL_REG_PL,
	GET_GLOBAL_REG,//全局寄存器
	//EMERGENCY_STOP,
	SCAN_LOG,
	GLOBAL_ROBOT_RESET,//停止 
	GET_GLOBAL_MESSAGE,//获取全局消息
	GET_GLOBAL_CONTROL_VERSION,//将每个动态库的类名以及版本号日期写入xml文件，
	MESSAGE_CLEAR,//消息清除，

    //SHUTDOWN,
    
	///局部命令
    OPEN_PROGRAM_FILE,//打开程序文件
    MANUAL_STEP,//手动单步
	MANUAL_SERIES,//手动连续
	AUTO_RUN,//自动运行
	MANUAL_MOVE,//手动示教移动，要带坐标系参数：关节，笛卡尔，左右手姿态，第几个轴
	ROBOT_RUN,//运行
    ROBOT_RESET,//停止
    ROBOT_CEASE,//暂停
    BUTTON_REALESED,//按键松开
	SET_MANUAL_SPEED,//设置手动速度
    SET_AUTO_SPEED,//设置自动速度
    PROGRAM_CMD_CHANGED,//指令修改，不包括点位数据
  //  PROGRAM_POINT_CHANGED,//点位修改
    PROGRAM_CHANGED,//指令编辑修改，包括点位数据
	CONFIG_CHANGED,//配置信息修改了
    MOVE_TO_POINT,//移动到点,参数：关节/直线
    SERVO_CONTROL,//伺服控制  on/off 等
 	POINT_TYPE_TRANSFORM,//点位数据转换
    COORDINATE_CHANGE,//坐标系更改，参数：1.用户/工具/世界/关节 2.编号
    ACTIVE_COORDINATE,// 参数：1. 用户/工具  2.编号

    SAVE_LOCAL_REG_R,
	SAVE_LOCAL_REG_PR,
	SAVE_LOCAL_REG_PL,
	//EMERGENCY_STOP, 
	GET_LOCAL_REG,//局部寄存器
    	
};


enum TIMER_REG_PROCESS_TYPE
{
    TIMER_REG_PROCESS_STOP,
    TIMER_REG_PROCESS_START,
    TIMER_REG_PROCESS_RESET,
    TIMER_REG_PROCESS_REG
};

enum CONTROLLER_STATUS_TYPE
{
    CONTROLLER_POWER_OFF,
    CONTROLLER_POWER_ON,
    CONTROLLER_STATUS_END
};

enum JOINT_FLAG_TYPE
{
    JOINT_FLAG_JOINT=0,
    JOINT_FLAG_CARTESIAN=1
};

enum E_VELOCITY_PROFILE_TYPE
{
    E_VELOCITY_PROFILE_TYPE_TAPE,
    E_VELOCITY_PROFILE_TYPE_SPLINE,
    E_VELOCITY_PROFILE_TYPE_COMBINED
};

#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The ControllerIpGroupInfo struct      控制器ｉｐ组信息
 */
struct ControllerIpGroupInfo
{
    std::string ipAddress;///ｉｐ地址
    std::string gateWay;///网关
    std::string dnsServer;///ｄｎｓ服务器
};
#endif

/**
 * @brief The MultiThreadInfo struct    多任务属性结构体
 */
struct MultiThreadInfo
{
    std::string componentName;  ///组件实例名
    std::string runningFileName;///running文件名
    int lineNum;                ///当前的行号
    std::vector<int> breakPointNum;///断点的行号
};




//#ifndef hmigsoapnamespaceStub_H
///*
//
//　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
//  */
///**
// * @brief The PointPro struct       点信息
// */
//struct PointPro
//{
//    int jointFlag;                  //0:关节;1:笛卡尔;
//    int pointNum;                   //点 编号
//    int groupNum;                   //组 编号
//    int ufValue;                    //用户坐标系 编号
//    int utValue;                    //工具坐标系 编号
//    int recordStatus;                  //在使用用户坐标系，或者是工具坐标系进行坐标系示教的时候（三点法，四点法，六点法），记录该点的示教状态，０代表未示教　　１代表已经示教
//    std::string configString;       //多解 选择;多圈 选择
//    std::vector<int> configInt;     //多解 选择;多圈 选择
//    std::vector<float> positionValue;//关节值 or 笛卡尔值
//    std::vector<float> extPositionValue;//外部轴的值，仅存在关节形式
//};
//#endif


#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief 码垛点结构体。华磊修改。
 */
struct PalletPoint
{
    int palletNumber; //码垛号
    int pointType;  	  //点类型0 堆栈点。1 接近点。 2 逃离点。
    int pointNumber;  //接近点号 或 逃离点号
    std::vector<int> rowColumnLayer;//行列层
};
#endif
// 轴逻辑类型　０普通机器人轴，1外部轴,2ａｇｖ车轮,3虚拟机器人轴，4虚拟龙门并行轴，5虚拟凸轮跟随轴，6独立控制轴
enum E_AXIS_LOGIC_TYPE
{
    E_AXIS_LOGIC_TYPE_COMMON=0,
    E_AXIS_LOGIC_TYPE_EXT=1,
    E_AXIS_LOGIC_TYPE_AGV=2,
    E_AXIS_LOGIC_TYPE_VIRTUAL_ROBOT=3,
    E_AXIS_LOGIC_TYPE_VIRTUAL_PARALLEL=4,
    E_AXIS_LOGIC_TYPE_VIRTUAL_CAM=5,
    E_AXIS_LOGIC_TYPE_VIRTUAL_STAND_ALONE=6,
    E_AXIS_LOGIC_TYPE_AGVSTEERING=7,
};

/**
 * @brief The JointAttribute struct 关节属性
 */
struct JointAttribute
{
    /**
     * @brief jointName 关节名称，华磊添加
     */
    std::string jointName;//在公共目录下，使用std::string
	/**
     * @brief jointType 关节类型
     * ０    旋转关节
     * １    移动关节
     */
    int jointType;
    /**
     * @brief dhType
     * 0    standard dh
     * 1    modified dh
     */
    int dhType;//华磊添加　dh参数类型
    /**
     * @brief dhParameter
     * \sita    Z轴之间的夹角 单位 rad
     * \d       Z轴方向的偏移量 单位 m
     * \a       X轴方向的偏移量 单位 m
     * \alpha   X轴之间的夹角 单位 rad
     */
    double dhParameter[4];//华磊修改　把原来的QVector<float>dhParameter改为double dhParameter[4]
    //华磊修改　把原来的QVector<float>positionVary改为两个变量maxPosition和minPosition
    /**
     * @brief maxPosition 电机转角/位移最大值，单位 mm degree
     */
    float maxPosition;
    /**
     * @brief minPosition 电机转角/位移最小值，单位 mm degree
     */
    float minPosition;
    double approachDistance;//接近极限的距离
    /**
     * @brief positionOffset 电机位置偏移 mm  degree
     */
    float positionOffset;
    /**
     * @brief maxVelocity 最大转速 mm/s degree/s
     */
    float maxVelocity;
    float maxFeedbackVelocity;
    /**
     * @brief maxToeque 最大转矩 N.mm
     */
    float maxToeque; //hualei  to delete
    float motorRatedTorque;//电机额定力矩　Ｎ.mm  hualei

    /**
     * @brief maxTorque 最大转矩 N.mm
     */
    float maxTorque;  //hualei

    float jogTorqueLimit; //hualei

    /**
     * @brief maxAccelation 最大加速度 degree/s^2 mm/s^2
     */
    float maxAccelation;
    /**
     * @brief mass 关节质量
     */
    float mass;
    /**
     * @brief massCenter 关节质心
     * x y z
     */
    QVector<float>massCenter;
    /**
     * @brief inertiaMatrix 惯性张量矩阵
     * Ixx Iyy Izz Ixy Ixz Iyz
     */
    QVector<float>inertiaMatrix;
    /**
     * @brief viscousFriction 粘性摩擦常量
     */
    float viscousFriction;
    /**
     * @brief coulombFriction 库伦摩擦常量
     */
    float coulombFriction;
    /**
     * @brief mobile 能否转动
     * true 能转动
     * false 不能转动
     */
    bool mobile;
    /**
     * @brief gearRatio 电机齿轮比 >1
     */
    float gearRatio;
    /**
     * @brief screwPitch 螺距，单位 mm
     */
    float screwPitch;
    /**
     * @brief encoderResolution 电机编码器位数
     */
    int encoderResolution; //单位：bit
    /**
     * @brief pulsePerRound 电机一圈的脉冲数，初始化时计算
     */
    double pulsePerRound;//单位：pulse
    /**
     * @brief coupleFlag 耦合标记,其他关节是否对其产生作用 0或１
     */
    bool coupleFlag;
    /**
     * @brief coupleJoint 耦合作用的关节索引(该索引为原始影响关节)，从0开始
     */
    int coupleJoint;
    /**
     * @brief coupleReducer 对耦合作用有影响的减速比（关节　影响　关节。关节　影响　直线。　该参数２种情况都适用。正负关联补偿方向。关节　影响　直线　的情况，参数为-1 或１。）
     */
    float coupleReducer;
    /**
     * @brief 外部轴标识,是否外部轴, 0:内部轴 1:外部轴
     */
    int externAxisFlag;
    /**
     * @brief 指令精确到达的目标点允许误差
     */
    float targetFollowError;//单位：mm degree
    /**
     * @brief 跟隨過程最大允许误差
     */
    float processFollowError;//单位：mm degree
    float processVelocityFollowError;//mm/s ,　degree/s
    int motorDirection;//华磊修改-1 或１

    int motorTorqueLimitPositive;//unit is %0.1 电机最大电流
    int motorTorqueLimitNegative;//unit is %0.1 电机最大电流
    int motorTorqueFilterTime;//unit is 0.01ms

    double t1RatioLimit;

    E_AXIS_LOGIC_TYPE axisLogicalType;
    //

};

#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief MoveParamater 移动参数
 */
struct MoveParameter
{
    int moveType;			//关节、直线、圆弧
    int velocityUnit;		//单位　０是百分比　１是mm/s　２是°/s
    float velocity;			//指令里面的速度值	
    PointPro targetPoint;//hmiAPI_update20161107.h
    PalletPoint palletPoint;
    int pointType;//0 普通P点, 1 码垛点, 2　PR寄存器点（华磊修改）
    int index;				//点的编号pointNum
    int cntRatio;			//cnt
    float acc;               // 加速度 类型改为float,单位是百分比
    int lineNumber;        //行号
    int wjnt;   //姿态是否控制, 直线或者圆弧时对机械手腕姿态是否进行控制
    int poseOffset;//0 正常，　１　直接补偿
    int poseOffsetIndex; //直接补偿PR[]
    int  toolOffset;//0 正常，　１　直接补偿
    int toolOffsetIndex; //直接补偿PR[]
    int incFlag;//0 正常，　１增量运动
    int evFlag;//附加轴运动标识。
    int evVelocity;//0-100附加轴速度比例
    int pathFlag;//路径规划曲线标识

};
#endif

/**
 * @brief ToolCoordinateInformation 工具坐标系信息
 */
struct ToolCoordinateInfo
{
    int index;
    float error;
    int method;
    QVector<PointPro> pointList;
    QVector<double>  xyzwpr; //华磊增加，法兰到TCP
    double mass;
    QVector<double> massCenter;
//    KDL::Frame forwardTcpMatrix;//从法兰到TCP
//    KDL::Frame inverseTcpMatrix;//从TCP到法兰
    std::string name;
};

/**
 * @brief UserCoordinateInformation 用户坐标系信息
 */
struct UserCoordinateInfo
{
    int index;
    int method;
    QVector<PointPro> pointList;
    QVector<double>  xyzwpr; //华磊增加，从世界坐标原点到用户原点
//    KDL::Frame forwardTcpMatrix;//从世界坐标原点到用户坐标原点
//    KDL::Frame inverseTcpMatrix;//从用户坐标原点到世界坐标原点
    std::string name;
};

//struct JointData
//{
//    float position;//位置 　（deg 或　mm）
//    float speed;//速度　　（deg/s　或　mm/s)
//    float acceleration;
//    float torque;//力矩       (Ｎ.mm 或　N)
//};



struct MotorData
{
    int position;//位置 　　（  puls编码器单位）
    int speed;//速度　　     （puls/s)
    int acceleration;//加速度　　     （puls/s^2)
    int torque;//力矩             (0.1%　电机额定力矩千分比)
    short torqueOffset;//   - 力距漂移　(0.1%　电机额定力矩千分比)
    int velocityOffset;//   - 速度漂移 （puls/s)
    double pulsePerRound;//电机转１圈对应编码器的脉冲数　　     （２５００线编码器对应１００００脉冲)
};

#define D_WAVE_AXIS_SIZE 16

struct MathDataInfo
{
    double timeStamp;
    double position_command[D_WAVE_AXIS_SIZE];
    double velocity_command[D_WAVE_AXIS_SIZE];
    double torque_command[D_WAVE_AXIS_SIZE];
    double idealTorque[D_WAVE_AXIS_SIZE];
    double torqueBias[D_WAVE_AXIS_SIZE];
    double position_feedback[D_WAVE_AXIS_SIZE];
    double velocity_feedback[D_WAVE_AXIS_SIZE];
    double torque_feedback[D_WAVE_AXIS_SIZE];
    double position_followOffset[D_WAVE_AXIS_SIZE];
    double velocity_followOffset[D_WAVE_AXIS_SIZE];
    double torque_followOffset[D_WAVE_AXIS_SIZE];
    double velocity_offset_command[D_WAVE_AXIS_SIZE];
    double torque_offset_command[D_WAVE_AXIS_SIZE];

    int position_command_puls[D_WAVE_AXIS_SIZE];
    int velocity_command_puls[D_WAVE_AXIS_SIZE];
    int torque_command_puls[D_WAVE_AXIS_SIZE];
    int position_feedback_puls[D_WAVE_AXIS_SIZE];
    int velocity_feedback_puls[D_WAVE_AXIS_SIZE];
    int torque_feedback_puls[D_WAVE_AXIS_SIZE];
    int position_followOffset_puls[D_WAVE_AXIS_SIZE];
    int velocity_followOffset_puls[D_WAVE_AXIS_SIZE];
    int torque_followOffset_puls[D_WAVE_AXIS_SIZE];
    int velocity_offset_command_puls[D_WAVE_AXIS_SIZE];
    int torque_offset_command_puls[D_WAVE_AXIS_SIZE];

    double vehiclePositionCommand[D_WAVE_AXIS_SIZE];
    double vehiclePositionFeedback[D_WAVE_AXIS_SIZE];
    double deltaDistance_x;
    double deltaDistance_y;
    double deltaAngle;
    double absoluteDistance;
    double absoluteAngle;
    double anglePidOutput;
    double xPidOutput;
    double yPidOutput;
    int calculateBiasType;

    double aDin[D_WAVE_AXIS_SIZE];
};

#define BUFFER_DATA_LENGTH 5000
struct WaveMotorData
{
    MathDataInfo mathData[BUFFER_DATA_LENGTH];
//    volatile double timeStamp[10][BUFFER_DATA_LENGTH];
//    volatile double position_command[10][BUFFER_DATA_LENGTH];
//    volatile double velocity_command[10][BUFFER_DATA_LENGTH];
//    volatile double torque_command[10][BUFFER_DATA_LENGTH];
//    volatile double position_feedback[10][BUFFER_DATA_LENGTH];
//    volatile double velocity_feedback[10][BUFFER_DATA_LENGTH];
//    volatile double torque_feedback[10][BUFFER_DATA_LENGTH];
//    volatile double position_followOffset[10][BUFFER_DATA_LENGTH];
//    volatile double velocity_followOffset[10][BUFFER_DATA_LENGTH];
//    volatile double torque_followOffset[10][BUFFER_DATA_LENGTH];
//    volatile double velocity_offset_command[10][BUFFER_DATA_LENGTH];
//    volatile double torque_offset_command[10][BUFFER_DATA_LENGTH];

//    volatile int position_command_puls[10][BUFFER_DATA_LENGTH];
//    volatile int velocity_command_puls[10][BUFFER_DATA_LENGTH];
//    volatile int torque_command_puls[10][BUFFER_DATA_LENGTH];
//    volatile int position_feedback_puls[10][BUFFER_DATA_LENGTH];
//    volatile int velocity_feedback_puls[10][BUFFER_DATA_LENGTH];
//    volatile int torque_feedback_puls[10][BUFFER_DATA_LENGTH];
//    volatile int position_followOffset_puls[10][BUFFER_DATA_LENGTH];
//    volatile int velocity_followOffset_puls[10][BUFFER_DATA_LENGTH];
//    volatile int torque_followOffset_puls[10][BUFFER_DATA_LENGTH];
//    volatile int velocity_offset_command_puls[10][BUFFER_DATA_LENGTH];
//    volatile int torque_offset_command_puls[10][BUFFER_DATA_LENGTH];

//    volatile double vehiclePositionCommand[10][BUFFER_DATA_LENGTH];
//    volatile double vehiclePositionFeedback[10][BUFFER_DATA_LENGTH];
//    volatile double deltaDistance_x[BUFFER_DATA_LENGTH];
//    volatile double deltaDistance_y[BUFFER_DATA_LENGTH];
//    volatile double deltaAngle[BUFFER_DATA_LENGTH];
//    volatile double absoluteDistance[BUFFER_DATA_LENGTH];
//    volatile double absoluteAngle[BUFFER_DATA_LENGTH];
//    volatile double anglePidOutput[BUFFER_DATA_LENGTH];
//    volatile double xPidOutput[BUFFER_DATA_LENGTH];
//    volatile double yPidOutput[BUFFER_DATA_LENGTH];
};



struct PingPongBuffer
{
    WaveMotorData buffer[2];
    int currentWriteBufferIndex = 0;
    int currentWriteBufferSubIndex = 0;
    int currentReadBufferIndex = 0;
    int currentReadBufferSubIndex = 0;
    int bufferValidateDataLength=2300;
};

/**
 * @brief The ServoParameter struct 伺服参数
 */
struct ServoParameter
{
    unsigned long long posKpp[10];
    unsigned long long posFeedFrontFilter[10];
    unsigned long long velKpp[10];
    unsigned long long velIntegration[10];
    unsigned long long  velFeedBackFilter[10];
};

//struct MotorCommand
//{
//    float motorPosition;
//    float motorVelocity;
//    float motorTorque;
//    float motorAcceleration;
//};

#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
struct UserInfo
{
    int account;                    //用户ID
    std::string password;           //密码
    std::string ip;                 //IP地址
    std::string operationSystem;    //操作系统
};
#endif

#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The Message struct        信息结构体
 */
struct Message
{
    int MessageLevel;               //消息级别
    std::string time;               //产生时间
    int robotId;                    //机器人Ｉｄ
    string componentClassName; //组件类名
    string messageType;        //消息类型
    int messageCode;                //消息ID
    int parameter1;                 //消息参数1
    int parameter2;                 //消息参数2
    int parameter3;         //消息参数3
    int parameter4;         //消息参数4
    string MessageInformation; //消息内容(提供用户可见)
};
#endif

///**
// * @brief The CurrentRunFile struct 当前运行程序
// */
//struct CurrentRunFile
//{
//    std::vector<std::string> runingFileName;     //当前运行程序名
//    std::vector<int> runningFileLine;            //当前运行行号
//};

/**
 * @brief The CurrentRunFile struct 当前运行程序
 */
//struct CurrentRobotRunFile
//{
//    vector <std::string> runningFileName;      //当前运行的程序名
//    vector <int> runningFileLine;              //当前运行行号
//    vector <std::string> relatedFileName;      //关联文件名
//};

#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The ComponentVersion struct   组件版本
 */
struct ComponentVersion
{
    string componentName;               //组件名
    string componentVersion;            //组件版本
    string publishDate;                 //发布时间
};
#endif

///**
// * @brief The PrRegStruct struct            ｐｒ寄存器
// */
//struct PrRegStruct
//{
//    int jointFlag; //0:关节;1:笛卡尔;
//    std::vector <float> prValue;//pr寄存器的值

//};

#ifndef soapStub_H
/*

　跟ｇｓｏａｐ接口用到的所有结构体，都冲突。改为直接使用gsoap的头文件
  */
/**
 * @brief The PlRegStruct struct    pl寄存器
 */
struct PlRegStruct
{
    int row;//行
    int col;//列
    int layer;//层

};
#endif

enum E_ETHERCAT_STAGE
{
    E_ETHERCAT_STAGE_INIT,
    E_ETHERCAT_STAGE_OP_IN,
    E_ETHERCAT_STAGE_RECEIVE_OK,
    E_ETHERCAT_STAGE_DOMAIN_PROCESS_OK,
    E_ETHERCAT_STAGE_CHECK_DOMAIN_OK,
    E_ETHERCAT_STAGE_CHECK_MASTER_OK,
    E_ETHERCAT_STAGE_CHECK_SLAVES_OK,
    E_ETHERCAT_STAGE_UPDATE_DOMAIN_OK,
    E_ETHERCAT_STAGE_DC_UPDATE_OK,
    E_ETHERCAT_STAGE_DOMAIN_QUEUE_OK,
    E_ETHERCAT_STAGE_OP_OUT,


};

struct EthercatDebugInfo
{
    int masterCurrentState;//当前状态
    int masteroldState;
    int masterCommandState;//目标状态
    E_ETHERCAT_STAGE stage;
    std::vector<int> slaves_al;
    int wkc_count;
    int wkc_lost_max;
    int wkc_state;
    double opLoopCount;
    int dcTimerShift;
    int cycle_us;
    unsigned int refTime;
    uint64_t rerfSumTime;
    int32_t  dc_diff_ns ;
    uint64_t pcSumTime;
    uint64_t pcCycleCount;
    int ecatPeriodTimerMonitor_now;
    int ecatPeriodTimerMonitor_max;
    int ecatPeriodTimerMonitor_min;
    int ecatReceiveMonitor_now;
    int ecatReceiveMonitor_max;
    int ecatReceiveMonitor_min;
    int ecatSendMonitor_now;
    int ecatSendMonitor_max;
    int ecatSendMonitor_min;
    int ecatCustomMonitor_now;
    int ecatCustomMonitor_max;
    int ecatCustomMonitor_min;

};

struct ZeroReturnParameter
{
    int isNeedGoZeroAfterBoot;//增量编码器，上电时，是否强制要求先回零。
    int isGoZero;//绝对值编码器原点丢失时，回零操作是否去找原点
    int goZeroMethod;//6098h
    double goZeroSpeed;//6099h degree/s mm/s
    double goZeroSlowSpeed;//6099h degree/s mm/s
    double goZeroAcceleration;//609ah
    double goZeroTorqueLimitPositive;//60e0h
    double goZeroTorqueLimitNegative;//60e1h
    double goZeroTimeOutLimit;//2005-24h
    int goZeroSequence;
    int aiEncoderIndex;//舵轮用，使用电阻编码器进行上电校准
    double aiEncoderRatio;//模拟量编码器和关节角的比例，带±号
    double aiEncoderOffset;//模拟量编码器和关节角的偏移量degree，带±号
    int zeroSensorIndex;//零点开关，从０开始

};

enum EM_ZERO_MOVINT_TYPE
{
    EM_ZERO_MOVINT_TYPE_NONE,
    EM_ZERO_MOVINT_TYPE_ONE_AXIS,
    EM_ZERO_MOVINT_TYPE_ALL_AXISES

};

enum EM_ZERO_MOVING_STATUS
{
    EM_ZERO_MOVING_STATUS_OUT,
    EM_ZERO_MOVING_STATUS_MOVING,
    EM_ZERO_MOVING_STATUS_FINISHED,
    EM_ZERO_MOVING_STATUS_ERROR
};


enum E_MODBUS_TYPE
{
    E_MODBUS_TYPE_RTU=1,
    E_MODBUS_TYPE_TCP=2
};

//enum E_VENDOR_ID
//{
//    E_VENDOR_ID_AI_KONG=1,
//    E_VENDOR_ID_LEI_SAI=3,
//    E_VENDOR_ID_ZONG_KE_ZHI_KONG=4,
//    E_VENDOR_ID_KINCO=5,
//    E_VENDOR_ID_DE_MO_TE = 6,
//    E_VENDOR_ID_NAI_LI_KE = 7,
//    E_VENDOR_ID_SHANGHAI_WEIQUN=8,
//};

struct CommunicateParameter
{
    E_MODBUS_TYPE modbusType;
    QString ip;
    int port;

    QString serialDeviceName;
    int baud;
    QString parity;
    int data_bit;
    int stop_bit;
    /**
     * @brief isUseUsbDeviceSerialCode 是否使用ｕｓｂ串口线序列号识别
     */
    int isUseUsbDeviceSerialCode;
};

struct RegConfig
{
    int ratedCurrency;
    int maxCurrency;
    int watchDogTimeOut;
    int driverModel;
};


struct RegAddressInfo
{
    quint16 pwmControlAdd;
    quint16 speedControlAdd;
    quint16 positionControlSpeedAdd;
    quint16 positionControlPositionHighAdd;
    quint16 positionControlPositionLowAdd;
    quint16 ratedCurrencyAdd;
    quint16 maxCurrencyAdd;
    quint16 watchDogTimeOutAdd;
    quint16 driverModelAdd;
    quint16 motorCurrentSpeedFeedbackAdd;
    quint16 motorCurrentCurrencyFeedbackAdd;
    quint16 motorCurrentPositionFeedbackHighAdd;
    quint16 motorCurrentPositionFeedbackLowAdd;
    quint16 errorCodeAdd;
    quint16 deviceModelTypeAdd;
};




#include "globalDefine.h"
#include "pathdefine.h"
#endif
